#include"smartPtr.h"

struct Date
{
    int _y, _m, _d;
    Date(int y = 2025, int m = 11, int d = 29)
        :_y(y), _m(m), _d(d)
    {
        cout << "Date(int y = 2025, int m = 11, int d = 29)" << endl;
    }
    // // 自己写了拷贝构造，那初始化列表就要手动拷贝，编译器不会帮你完成
    // Date(const Date& d) 
    // {
    //     ;
    // }
    ~Date() { cout << "~Date()" << endl; }
};

void test01()
{
    Wang::shared_ptr<Date> p;
    p = new Date;
    // Wang::shared_ptr<Date> p1(p);
    // p->_d++;
    // p = p1;
    // Wang::shared_ptr<Date> p2(new Date);
    // p = p2;
}
void test()
{
    // Date d1;
    // // Date d2(d1);
    // {
    //     const Date& dr = d1; // 引用左值，并不会把d1的生命周期变为dr的
    // }
    // Date();
    // {
    //     const Date& dr = Date();
    // }
    Date* p = nullptr;
    auto del = [](Date* p) { delete p; };
    del(p);
}

#include<memory>
struct ListNode
{
    int _val;
    // // 写成下面就会循环引用
    // std::shared_ptr<ListNode> _next;
    // std::shared_ptr<ListNode> _prev;

    // 正确写法, weak_ptr支持用shared_ptr构造，不会增加引用计数
    std::weak_ptr<ListNode> _next;
    std::weak_ptr<ListNode> _prev;
    ~ListNode() { cout << "~ListNode()" << endl; }
};

void test02()
{
    std::shared_ptr<ListNode> p1(new ListNode);
    std::shared_ptr<ListNode> p2(new ListNode);
    // // 循环引用
    p1->_next = p2;
    p2->_prev = p1;
}

int main()
{
    test02();

    return 0;
}

/* 拷贝构造补充内容
class A
{
public:

	int _a;
	A() { cout << "A()" << endl; }
	~A() { cout << "~A()" << endl; }
	A(const A& a)
		:_a(a._a)
	{
		cout << "A(const A& a)" << endl;
	}
};

class B
{
public:
	int _b;
	A _aa;

	B() { cout << "B()" << endl; }

	// 拷贝构坑点：就按初始化列表的来，初始化列表什么都没写，那就什么都不做
	// 对自定义类型并不会调用其拷贝构造，而是调用其默认构造！！！
	B(const B& b)
	{
		cout << "B(const B& b)" << endl;
	}
};

int main()
{
	B b1;
	b1._b = 1;
	b1._aa._a = 2;
	B b2 = b1;
	return 0;
}*/